<?php

/**
 * curl请求
 */
if (!function_exists('curlRequest')) {
    function curlRequest($url_ = null, $type = 'get', $param = [], $headers = [], bool $encodeParam = false, bool $decodeData = true)
    {
        // get请求 url为空时默认走小程序获取
        if (empty($url_)) {
            throw new Exception('未定义请求地址');
        }
        // get 请求
        if (!empty($url_) && $type == 'get' && !empty($param)) {
            $url = $url_ . '?' . http_build_query($param);
        }
        // post 请求
        if (!empty($url_) && $type == 'post' && !empty($param)) {
            $url = $url_;
        }
        // param 为空的使用 get
        if (!empty($url_) && $type == 'get' && empty($param)) {
            $url = $url_;
        }
        // param 为空的使用 post
        if (!empty($url_) && $type == 'post' && empty($param)) {
            $url = $url_;
        }

        $ch = curl_init();
        // 设置URL
        curl_setopt($ch, CURLOPT_URL, $url);
        // 设置header
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        // 设定是否显示头信息
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 如果你想把一个头包含在输出中，设置这个选项为一个非零值。
        curl_setopt($ch, CURLOPT_HEADER, false);
        // 设置一个长整形数，作为最大延续多少秒。
        curl_setopt($ch, CURLOPT_TIMEOUT, 120);
        if ($type == 'post') {
            if ($encodeParam == true) {
                $param = json_encode($param);
            }
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
        }
        // 验证对等方的证书,false = 阻止验证 true = 验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        // 检查SSL对等证书中是否存在公用名 / 检查是否存在公用名，并验证它是否与提供的主机名匹配
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        // 输出解析的数据
        $data = curl_exec($ch);
        // 关闭 curl 资源
        curl_close($ch);
        // 返回 curl 解析被json格式化后的数据
        if ($decodeData == true) {
            return json_decode($data, true);
        } else {
            return $data;
        }
    }
}

/**
 * 微信接口调用凭据
 */
if (!function_exists('wxAccessToken')) {
    function wxAccessToken()
    {
        // 获取缓存
        $redis = (new Illuminate\Support\Facades\Redis);
//        $key = 'wx:access_token';
//        if ($redis::exists($key)) {
//            return $redis::get($key);
//        }

        $appId = config('services.wechat.appid'); //小程序AppID
        $appSecret = config('services.wechat.app_secret'); //小程序AppSecret
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";

        $response = file_get_contents($url);
        $result = json_decode($response, true);

        if (isset($result['errcode'])) {
            throw new Exception($result['errmsg']);
        }

        // 设置缓存
//        $redis::setEx($key, 7000, $result['access_token']);

        return $result['access_token'];
    }
}

/**
 * 获取存储文件地址
 */
if (!function_exists('storage')) {
    function storage($url)
    {
        if (empty($url) || strpos($url, 'http') === 0) {
            return $url;
        }
        return config('app.url') . '/storage/' . $url;
    }
}

/**
 * 获取第一个存储文件地址
 */
if (!function_exists('storageFirst')) {
    function storageFirst($url)
    {
        if (empty($url) || strpos($url, 'http') === 0) {
            return $url;
        }

        $url = explode(',', $url)[0];
        return storage($url);
    }
}

/**
 * 获取多个存储文件地址
 */
if (!function_exists('storageMulti')) {
    function storageMulti($url)
    {
        if (empty($url) || strpos($url, 'http') === 0) {
            return [];
        }
        $url = explode(',', $url);
        $url = array_map(function ($item) {
            return storage($item);
        }, $url);
        return $url;
    }
}

/**
 * 移除存储文件地址
 */
if (!function_exists('storageRemove')) {
    function storageRemove($url)
    {
        if (empty($url)) {
            return $url;
        }
        $remove = config('app.url') . '/storage/'; // 要去除的部分
        $position = strpos($url, $remove) + strlen($remove); // 计算新位置的起始索引
        $url = substr($url, $position);
        return $url;
    }
}

/**
 * 时间转换
 */
if (!function_exists('timeTran')) {
    function timeTran($the_time)
    {
        $show_time = strtotime($the_time);
        $dur = time() - $show_time;
        if ($dur < 0) {
            return $the_time;
        } else {
            if ($dur < 60) {
                return $dur . '秒前';
            } else {
                if ($dur < 3600) {
                    return floor($dur / 60) . '分钟前';
                } else {
                    if ($dur < 86400) {
                        return floor($dur / 3600) . '小时前';
                    } else {
                        if ($dur < 259200) { // 3天内
                            return floor($dur / 86400) . '天前';
                        } else {
                            return $the_time;
                        }
                    }
                }
            }
        }
    }
}
